A J2EE application is a multi-tiered, distributed application that commonly comprises a web-tier that interacts with a business-tier and an enterprise information systems (EIS) tier. It is also possible for a J2EE application to consist only of a business tier and an EIS tier components; there is no web component. These non-web J2EE applications are referred to as being “system-oriented,” where their clients are also applications systems or computers and not end-users or human beings. In order for intersystem communications to take place, application stubs, the software that resides on the client's end, must be distributed to the client systems.
As any software user knows, as time progresses, enhancements and bug fixes are added to applications. These changes may result in a new application version or release (the terms “version” and “release” are used interchangeably herein to refer to a particular embodiment of a program/application/service). With a web-based J2EE application, clients can be redirected to the new application version in an easy, seamless fashion with minimal system downtime through the use of hardware load balancers and additional hardware (e.g., additional machines or computers). For a system-oriented J2EE application, however, migrating clients to the new application version is much more complicated, as new versions of the application stubs must be generated and distributed to client systems themselves. The changes take effect only when the clients switch to using the new application stub. This switching action must be performed in a synchronous fashion between the client and the server applications; otherwise, it may result in incompatibility errors in the binary code of the software. This complexity is further compounded if the server application is a service provider that provides an array of services co-shared by multiple clients.
As an example, consider clients X and Y sharing a service, “Service A” on a machine M1. Client X requests updates for Service A when they are issued. Deploying the new version of Service A (Service A, version 2) for Client X on M1 requires Client Y to also upgrade to avoid binary incompatibility errors. This, in itself, may cause a problem, since Client Y may not wish to upgrade to the new version.
Further, if the updated version of Service A (Service A, version 2) does not work well and Client X decides to fall back to the old version, Client Y must also execute the fallback procedure or risk having additional binary incompatibility errors. This “synchronous application upgrade” requires tight coupling between clients and in this case, causes unwarranted service discontinuity for Client Y.
To avoid tight coupling among clients, the service provider may deploy the new application version (Service A, version 2) on a second machine M2, and have Client X point to M2, thus allowing Client Y to continue to use the old version on machine M1. This strategy, however, incurs additional hardware costs and efforts to configure the new environment. The complexity, cost and risk increases with additional clients and increased frequency of application upgrades.
As a result of the above difficulties, application service providers do not attempt to provide multiple versions or releases of the same application to clients from the same machine. Accordingly, it would be desirable to have a method, system, and computer program product for server application management in which multiple, concurrent application versions can be managed with minimal cost, effort and risk, and allow the server application to perform an application upgrade for each client in an isolated, precise fashion without the need for multiple machines or service disruption to other clients.